Dart 2.6 正式发布, 新增利器 dart2native: 将 Dart 编译为自包含的本地可执行文件
Dart 提供了丰富多样的编译器,全方位助力开发者为移动设备和 web 平台优化生产代码。灵活的编译器技术让我们的框架合作伙伴可以针对不同的目标平台,构建各种类型的应用,例如: Android 和 iOS 平台上的 Flutter 应用、web 端和桌面端 Flutter 应用、web 端的 AngularDart 应用以及嵌入式设备上的 Google 助手。
今天,我们正式推出 dart2native。作为现有编译器集合的一个扩展,dart2native 可以将 Dart 程序编译为含有预编译机器码的自包含可执行文件。在它的协助下,您可以使用 Dart 在 macOS, Windows 或 Linux 上创建命令行工具。下方的功能宣传图就是使用 dart2native 来实现的。
丰富多样的编译器 https://dart.dev/platforms Android 和 iOS https://flutter.dev/docs web 端 https://flutter.dev/web 桌面端 https://github.com/flutter/flutter/wiki/Desktop-shells web 端的 AngularDart 应用 https://angulardart.dev 使用 dart2native 实现 https://gist.github.com/mit-mit/faec2bfc1d1cef7cd09df917e531c5c0
Dart Native 及 dart2native 编译器
引入 dart2native 后,我们将本地编译支持扩展至 macOS、Windows 和 Linux 三款传统桌面操作系统。利用 dart2native 创建的可执行文件属于自包含文件,因此在未安装 Dart SDK 的机器上亦能运行。由于可执行文件之前已经通过 Dart 的 AOT 编译器进行过处理,因此几毫秒后就会开始运行。在编译为本地代码的过程中,dart2native 与其它 Dart 编译器和运行时工具一样,也可以使用丰富且一致的 Dart 核心库。
许多客户要求我们为桌面操作系统提供 AOT 预编译支持 (Dart AOT 问题专区排名第 6 的功能请求),所以,我们很高兴终于将这项功能带到您身边。
如果您之前使用过 dart2aot,那么,升级至 Dart SDK 2.6 后,您将开始使用 dart2native,它的功能比 dart2aot 更加强大。
Dart Native https://dart.dev/platforms Flutter https://flutter.dev Dart 核心库 https://dart.dev/guides/libraries 排名第 6 的功能请求 https://github.com/dart-lang/sdk/issues/36915
使用 dart2native 构建命令行应用
main() {
print(‘Hello Dart developers’);
}
$ dart2native src/hello.dart -o hello
Generated: /Users/mit/hello
$ time ./hello
Hello Dart developers
real 0m0.049s
user 0m0.018s
sys 0m0.020s
之前,我们已经看到有不少 Dart 开发者小试牛刀,尝试利用 dart2native 开发命令行工具:
来自 SASS (一款深受开发者喜爱的 CSS 扩展工具) 团队的 Natalie 在 Github 上留言说,自从团队转用 dart2native 来编译基于 Dart 的 SASS 实现后,该实现的性能大幅提高,即使与 LibSass 这款基于 C++ 的实现相比也毫不逊色。
来自 Dart DevRel 团队的 Filip 使用 dart2native 重编译了自己的网站链接检查工具 linkchecker,二次编译后,小型网站的检查速度提升了整整 27 倍。
基于 Dart 的命令行应用 https://dart.dev/tutorials/server/cmdline dart:io https://api.dart.dev/stable/2.6.1/dart-io/dart-io-library.html http https://pub.dev/packages/http args https://pub.dev/packages/args SASS https://sass-lang.com/ 在 Github 上留言说 https://github.com/dart-lang/sdk/issues/32894#issuecomment-513975562 linkchecker https://github.com/filiph/linkcheck/ 提升了整整 27 倍 https://github.com/filiph/linkcheck/issues/7#issuecomment-496308288
通过 dart:ffi 与 C 代码互操作
dart_console
https://pub.dev/packages/dart_console
不到 500 行 Dart 代码就能写出一个 7MB 大小的代码编辑器: kilo
我们利用 Dart 核心库、dart:ffi 以及 dart_console 库开发出了几个十分有趣的控制台应用。我们大约用了 500 行 Dart 代码编写了一个名为 Kilo 的控制台文本编辑器,并将完整版演示封装至 dart_console 包内。Kilo 的命名源于它的前身 kilo.c —— 一款由不到 1,000 行 C 代码实现的简易文本编辑器。
新推出的 dart2native 编译器让打包工作变得十分简单,我们最终得到了一个 7MB 大小的自包含代码编辑器。请查看下方演示动图,了解 Kilo 的编译过程,以及编译后的 Kilo 是如何通过编辑自己的源代码来修复错误的。
大约用了 500 行 Dart 代码 https://github.com/timsneath/dart_console/blob/master/example/kilo.dart kilo.c https://github.com/antirez/kilo/blob/master/kilo.c
使用 dart2native 构建服务
无服务器计算 https://en.wikipedia.org/wiki/Serverless_computing Cloud Run https://cloud.google.com/run/ 《初试 Dart 微服务》 https://itnext.io/experiments-with-dart-microservices-fa117aa408c7 《服务器端应用》 https://dart.dev/tutorials/server/httpserver 《包》 https://dart.dev/server/libraries#server-packages
如何获取
更多官方文档 https://dart.dev/tools/dart2native dart.dev/get-dart https://dart.dev/get-dart
已知限制
不提供交叉编译支持 (Github 问题 28617): dart2native 编译器每次只能为一种运行系统创建机器码,因此,如需同时为 macOS、Windows 和 Linux 创建可执行文件,请您分别运行 3 次编译器。或者,您也可以与支持 3 种操作系统的持续集成 (Continuous Integration) 供应商接洽合作,共同解决这类问题。
不提供签名支持 (Github 问题 39106): 生成的可执行文件的格式与 codesign 和 signtool 等标准签名工具不兼容。
不支持 dart:mirrors 和 dart:developer (请参阅 Dart 核心库)。
Github 问题 28617 https://github.com/dart-lang/sdk/issues/28617 Github 问题 39106 https://github.com/dart-lang/sdk/issues/39106 Dart 核心库 https://dart.dev/guides/libraries
Dart 2.6 中的其它变更
C 语言互操作机制
https://dart.dev/guides/libraries/c-interop
《Dart 2.6 变更日志》
https://github.com/dart-lang/sdk/blob/master/CHANGELOG.md#foreign-function-interface-dartffi
Dart 问题追踪器
https://github.com/dart-lang/sdk/issues
扩展方法
https://github.com/dart-lang/language/issues/41
《Dart 扩展方法的基础知识》
https://medium.com/dartlang/extension-methods-2d466cd8b308
下一步
即刻下载 Dart 2.6 SDK (https://dart.dev/get-dart), 使用 dart2native 构建精彩应用,并向我们提交使用反馈。如果您想与我们分享更多使用细节,欢迎您在下方留言评论。期待您的出色表现!
想了解更多 Flutter 内容?
在公众号首页发送关键词 "Flutter",获取相关历史技术文章;
还有更多疑惑?欢迎点击菜单 "联系我们" 反馈您在开发过程中遇到的问题。
推荐阅读